package com.linked.universal.common;

import java.util.HashMap;
import java.util.Map;

/**
 * @author :dbq
 * @date : 2022/9/14 14:38
 */
public class Result extends HashMap<String, Object> {
    public Result() {
    }

    public Result(int code, String ifSuccess, String msg, Object data) {
        put("code", code);
        put("success", ifSuccess);
        put("message", msg);
        put("data", data);
    }

    /**
     * 返回带有提示信息得错误返回
     *
     * @param msg 返回提示内容
     * @Desipition 报异常时使用，返回带提示内容
     */
    public static Result error(String msg) {
        Result r = new Result();
        r.put("code", "500");
        r.put("success", false);
        r.put("message", msg);
        return r;
    }

    /**
     * @param msg  返回提示内容
     * @param data 返回数据
     * @Desipition 报异常时使用，返回带提示内容与数据
     * 例如： return Result.error("xxx接口异常"，“入参”)
     */
    public static Result error(String msg, Object data) {
        Result r = new Result();
        r.put("code", "500");
        r.put("success", false);
        r.put("message", msg);
        r.put("data", data);
        return r;
    }

    /**
     * @param msg 返回提示内容
     * @Desipition 在正确调用接口后，没有返回值得接口
     * 例如：return Result.success("xxx成功")
     */
    public static Result success(Object data) {
        Result r = new Result();
        r.put("code", "200");
        r.put("success", true);
        r.put("data", data);
        return r;
    }


    /**
     * @param msg  返回提示内容
     * @param data 返回数据
     * @Desipition 方法正常调用，并放回结果集data
     * 例如：return Result.success("xxx成功",list)
     */
    public static Result success(String msg, Object data) {
        Result r = new Result();
        r.put("code", "200");
        r.put("success", true);
        r.put("message", msg);
        r.put("data", data);
        return r;
    }

    /**
     * @param code
     * @Desipition 方法正常调用，没有抛出异常，直接返回错误码
     * 例如：return Result.ok("301")
     * 比如此时301，代表名字不能为null
     */
    public static Result ok(String code) {
        Result r = new Result();
        r.put("code", code);
        return r;
    }

    /**
     * @param msg       返回提示内容
     * @param ifSuccess 是否成功
     * @Desipition 方法正常调用，没有抛出异常，但是业务成功与否不确定时使用
     * 例如：return Result.ok(false,"xxx参数不能为null")
     */
    public static Result ok(boolean ifSuccess, String msg) {
        Result r = new Result();
        r.put("code", "200");
        r.put("success", ifSuccess);
        r.put("message", msg);
        return r;
    }

    /**
     * @param msg       返回提示内容
     * @param ifSuccess 是否成功
     * @Desipition 方法正常调用，没有抛出异常，但是业务成功与否不确定时,并需要返回数据
     * 例如：return Result.ok(false,"xxx参数不能为null",param)
     */
    public static Result ok(boolean ifSuccess, String msg, Object data) {
        Result r = new Result();
        r.put("code", "200");
        r.put("success", ifSuccess);
        r.put("message", msg);
        r.put("data", data);
        return r;
    }

    /**
     * @param msg       返回提示内容
     * @param ifSuccess 是否成功
     * @Desipition 方法正常调用，没有抛出异常，但是业务成功与否不确定时,同时返回特定得错误码时,并需要返回数据
     * 例如：return Result.ok(301,false,"xxx参数不能为null",param)
     * 比如此时301，代表名字不能为null
     */
    public static Result ok(String code, boolean ifSuccess, Object data) {
        Result r = new Result();
        r.put("code", code);
        r.put("success", ifSuccess);
        r.put("data", data);
        return r;
    }

    /**
     * @param msg       返回提示内容
     * @param ifSuccess 是否成功
     * @Desipition 方法正常调用，没有抛出异常，但是业务成功与否不确定时,同时返回特定得错误码时,并需要返回数据
     * 例如：return Result.ok(301,false,"xxx参数不能为null",param)
     * 比如此时301，代表名字不能为null
     */
    public static Result ok(String code, boolean ifSuccess, String msg, Object data) {
        Result r = new Result();
        r.put("code", code);
        r.put("success", ifSuccess);
        r.put("message", msg);
        r.put("data", data);
        return r;
    }


    /**
     * 极简错误返回
     */
    public static Result error() {
        return error("未知异常，请联系管理员");
    }

    /**
     * 极简正确返回
     */
    public static Result success() {
        Result r = new Result();
        r.put("code", "200");
        r.put("success", true);
        return r;
    }

    public Result put(String key, Object value) {
        super.put(key, value);
        return this;
    }

}
